%Opis implementacji

% TODO - dla ekipy implementującej: Szymon + ?

\section {Wykorzystane technologie, komponenty i oprogramowanie}

\begin{itemize}
	\item język programowania - Java 1.6
	\item kontrola wersji - Subversion
	\item zarządzanie projektem - Assembla (www.assembla.com)
	\item zarządzanie zależnościami - Maven
	\item środowisko programistyczne - Netbeans
\end{itemize}

\section {Dokumentacja użytkowa}

\subsection {Format plików wejściowych}

Pliki wejściowe przedstawiające startową planszę składają się z rozmiaru planszy i ciągu elementów (liczb całkowitych) rozdzielonych białymi znakami. Każda liczba reprezentuje jeden kolor, każdy element jedną kolorową kulkę. Elementy zapisane są wizualnie w postaci takiej występują na planszy, po kolei wierszami zaczynając od lewego górnego rogu.

Należy zaznaczyć że wewnętrznie w programie elementy indeksowane są dwuwymiarowo tak że element (1,1) znajduje się w lewym dolnym rogu i że grawitacja (opadanie kulek) następuje w kierunku malejących wartości osi y, czyli w dół.

\subsection {Opis przykładowych instancji danych wejściowych}

15\\
3 3 0 1 0 2 1 2 3 2 3 1 1 1 0\\
4 1 3 4 0 3 3 2 2 4 0 2 4 0 0\\
2 3 2 2 0 3 1 0 4 4 0 2 4 0 4\\
0 3 4 4 2 2 1 3 3 1 3 0 3 3 4\\
0 0 2 1 2 1 3 4 3 2 1 2 3 1 4\\
1 2 4 2 0 0 0 1 1 1 0 0 2 4 4\\
1 0 3 3 3 2 1 0 4 2 4 1 4 3 0\\
4 4 3 3 0 2 3 3 4 3 0 3 0 0 4\\
3 3 3 1 4 3 3 3 0 4 2 0 3 2 0\\
2 4 1 1 1 1 4 0 0 3 0 4 0 4 3\\
3 3 0 1 4 1 2 1 1 0 3 4 2 1 0\\
2 2 3 3 2 0 4 3 3 4 0 4 3 3 1\\
0 1 3 2 1 2 1 1 0 2 4 1 4 0 3\\
4 1 4 0 2 1 3 1 3 1 4 0 1 0 3\\
1 3 2 3 2 2 4 2 2 4 3 0 3 1 1\\

Plansza ta jest rozmiaru 15x15, jej elementy są pięciu różnych kolorów, indeksowanych od 0 do 4. Naciśnięcie w prawy dolny róg spowodowało by ściągnięcie z planszy dwóch elementów i opadnięcie o jedno pole dwóch kolumn.

\subsection {Kompilacja programu}

\subsubsection {Wymagane oprogramowanie do kompilacji}

Jedynymi narzędziami niezbędnymi do kompilacji programu jest Java SDK, Subversion i Maven. Jednak pomocne jest równierz posiadanie środowiska Netbeans.

\subsubsection {Proces kompilacji}

Po ściągnięciu najświeższej wersji aplikacji przy pomocy narzędzia subversion (komenda: svn checkout http://subversion.assembla.com/svn/samegame/), należy w katalogu głównym z projektem (zawierającym plik pom.xml) skompilować aplikację z pomocą narzędzia maven (mvn compile). Alternatywnie, po ściągnięciu projektu, należy zaimportować go do Netbeans wybierając ''Open Project...'' i wybierając plik pom.xml, a następnie na otworzonym projekcie głównym wybrać Clean and Build.

\subsection {Uruchomienie programu}

Aby uruchomić skompilowaną aplikację należy upewnić się że wszystkie klasy znajdują sie w classpath a następnie uruchomić klase główną Runner, nie są potrzebne żadne argumenty wywołania. Alternatywnie, w przypadku korzystania ze środowiska Netbeans, należy uruchomiać aplikację przy pomocy ''Run...'' wskazując klasę Runner jako klasę startową.

\subsubsection {Wczytanie lub zadanie danych wejściowych}

Aby uruchomić aplikację na konkretnych danych wejściowych wystarczy podać ścieżkę pliku jako argument uruchomienia aplikacji. Można podać kilka nazw plików aby uruchomić kilka testów. Dla przykładu: ''java Runner boards/15x5/test1.in boards/15x5/test12.in''.

\subsubsection {Uruchomienie wizualizacji działania algorytmu}

Po przeprowadzeniu każdej symulacji, po wykonaniu wszystkich kroków, na standardowe wyjście zostaje wypisana plansza reprezentująca najlepsze znalezione rozwiązanie. Jest ona w takim samym formacie jak dane wejściowe. W trakcie samego działania programu, co pewną ilość kroków jest wypisywana wartość fitness najlepszego rozwiązania i ilość wykonanych kroków algorytmu.

\subsubsection {Uruchomienie obliczeń testowych}

Uruchomienie aplikacji z zadanymi danymi wejściowymi od razu przeprowadza obliczenia testowe. Ponadto, poszczególne fragmenty algorytmu posiadają własne klasy testowe JUnit, które można przeprowadzić używając tego też narzędzia.

\subsubsection {Zapisanie wyników obliczeń testowych}

Wyniki obliczeń są wypisywane na standardowe wyjście i mogą zostać bez problemowo zapisane do pliku.
